package com.edu.boot.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.data.web.config.EnableSpringDataWebSupport;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.edu.boot.jpa.User;
import com.edu.boot.jpa.UserRepository;
/**
 * 操作：
 * 1将项目配成web项目，加入web包，取消context.close();修改属性文件等
 * 2使用@EnableSpringDataWebSupport，启用web相关的功能特性（默认不启用）
 * 3根据ID查询对象
 * 4解析URL 生成pageable对象
 * 5排序分页（多字段排序）
 * @author xl
 *
 */
@RestController  //该controller不用和页面打交道
//@RequestMapping("/api")
public class UserController {
	@Autowired
	private UserRepository userRepository;
	
	@GetMapping("/home") //这是spring4.3的写法 老的版本是@RequestMapping   get请求
	//@PostMapping("/home")  post请求
	public Object home(){ //http://localhost:8080/home
		return "home";//向页面返回一个home字符串,如果返回的是对象，会自动转换为json字符串（对象）
	}
	
	@GetMapping("/user/show") //http://localhost:8080/user/show?id=1
	public Object show(Integer id){
		return userRepository.findOne(id);
	}
	
	/**
	 * 这是jpa新特性，会自动读取URL上的参数id,,功能有限，只能使用读取id
	 * 因为有@EnableSpringDataWebSupport，会自动调用UserRepository，
	 * 然后查询User 给参数user
	 * @param user
	 * @return
	 */
	@GetMapping("/user/display")//http://localhost:8080/user/show?id=1
	public Object show2(@RequestParam("id") User user){
		return user;
	}
	
	/**
	 * 这是jpa新特性，会自动读取URL上的参数id,,功能有限，只能使用读取id
	 * 因为有@EnableSpringDataWebSupport，会自动调用UserRepository，
	 * 然后查询User 给参数user
	 * @param user
	 * @return
	 */
	@GetMapping("/user/display2/{id}")//http://localhost:8080/display2/show/1
	public Object show22(@PathVariable("id") User user){
		return user;
	}
//分页	
	@GetMapping("/user/all")
	public Object all(){
		return userRepository.findAll();
	}
	/**
	 * 因为有@EnableSpringDataWebSupport会将URL上的一些参数解析成
	 * Pageable对象，有了这个对象就可以分页了（PagingAndSortingRepository）
	 * @param pageable
	 * @return
	 */
	@GetMapping("/user/page")
	//http://localhost:8080/user/page    //默认是显示第一页，每页20条数据
	//page参数表示要显示第几页，默认为0 表示第一页。
	//size表示每页显示的条数，默认为20
	//http://localhost:8080/user/page?size=3
	//http://localhost:8080/user/page?size=2&page=1 //第二页
	public Object page(Pageable pageable){
		return userRepository.findAll(pageable);//返回的是Page对象
	}
	
	@GetMapping("/user/default")//修改page和size的默认值
	//http://localhost:8080/user/default    
	//http://localhost:8080/user/default?size=2&page=1    
	//默认的是@PageableDefault(size=10,page=0)
	public Object defaultPage(@PageableDefault(size=2,page=1) Pageable pageable){
		return userRepository.findAll(pageable);//返回的是Page对象
	}
	
//排序	
	@GetMapping("/user/sort")
	//http://localhost:8080/user/sort?sort=age    //按年龄排序（升序）    
	//http://localhost:8080/user/sort?sort=age,desc    //按年龄排序（倒序）    
	//http://localhost:8080/user/sort?sort=age,desc&sort=gender,desc    //按年龄排序（倒序）    
	public Object sort(Pageable pageable){
		return userRepository.findAll(pageable);//返回的是Page对象
	}
//分页加排序	
	@GetMapping("/user/sortandpage")
	//http://localhost:8080/user/sort?sort=age&size=2&page=1      
	public Object sortPage(Pageable pageable){
		return userRepository.findAll(pageable);//返回的是Page对象
	}
//以上的分页和排序使用的findall(),还可以自定义方法同时除了条件和分页（在repository中定义方法）
	@GetMapping("/user/mylist")
	//http://localhost:8080/user/mylist?gender=male&size=2&page=1      
	public Object myList(@RequestParam("gender") String gender, Pageable pageable){
		return userRepository.queryBySex(gender, pageable);//返回的是Page对象
	}
}
